#ifndef _MUNIX_SPI_H
#define	_MUNIX_SPI_H
/*******************************************************************************
 ** Name: spi.h                                                               **
 ** Description:              **
 **                                                                           **
 ** Open Source Initiative (OSI) Approved License                             **
 **                                                                           **
 ** The contents of this file are subject to the terms of the                 **
 ** Common Development and Distribution License, Version 1.0 only             **
 ** (the "License").  You may not use this file except in compliance          **
 ** with the License.                                                         **
 **                                                                           **
 ** You can find a copy of the license in the license.txt within              **
 ** this distribution or at http://www.munixos.net/licensing.                 **
 ** Software distributed under the License is distributed on an "AS IS"       **
 ** basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.           **
 ** See the License for the specific language governing permissions           **
 ** and limitations under the License.                                        **
 **                                                                           **
 ** When distributing Covered Code, include this CDDL header in each          **
 ** file and include the License file at $HOME/license.txt.                   **
 ** If applicable, add the following below this header, with the indicated    **
 ** fields enclosed by brackets "[]" replaced with your own identifying       **
 ** information: Portions Copyright [yyyy] [name of copyright owner]          **
 **                                                                           **
 **                                                                           **
 ** Copyright (c) 2009-2010  Barry Gian James <bjames@munixos.net>            **
 ** All rights reserved.                                                      **
 **                                                                           **
 ** Ref: $HeadURL$
 ******************************************************************************/
// Portions (C) 2011 OpenHouseware, LLC.
// All Rights Reserved

// $Id$
// Last Modified $DateTime$ by $Author$

#include "common.h"
#include "bus.h"

class SPI : public Bus
{
public:
#if defined(XMEGA_DEFINED)
	SPI(SPI_t * spi, uint8_t i = 0, BusMode m = BusMode::Master);
#endif
    SPI(uint8 i = 0, BusMode m = BusMode::Master);
    SPI(const SPI& orig) = delete;
    ~SPI() { if (rxBuff) delete rxBuff; if (txBuff) delete txBuff; }

    // implemented pure-virtual functions
    bool    Connect();
    void    SendByte(uint8 remote, char byte);
    void    SendWord(uint8 remote, wchar_t word);
    char    RecvByte();
    wchar_t RecvWord();
    void    PowerUp() { power_spi_enable(); }
    void    PowerDown() { power_spi_disable(); }

    bool    IsConfigured();

    inline char TxRx(volatile char c);
    void UseRxBuff(uint8 sz) { rxBuff = new RingBuff(sz); }
    void UseTxBuff(uint8 sz) { txBuff = new RingBuff(sz); }

    void ReleaseSlave() { if (IsConfigured()) BSET(*select->Port(),select->Pin()); }
    void SelectSlave() { if (IsConfigured()) BCLR(*select->Port(), select->Pin()); }

private:
#if defined(XMEGA_DEFINED)
	SPI_t *	spi;
#endif

};

#endif	/* _MUNIX_SPI_H */

